package com.qf.shiro.config;



import com.qf.shiro.authticator.CustomModularRealmAuthenticator;
import com.qf.shiro.realm.MembersRealm;
import com.qf.shiro.realm.UserRealm;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@SpringBootConfiguration
public class ShiroConfig {

    private Logger logger= LoggerFactory.getLogger(ShiroConfig.class);

    //拦截的过滤器的配置
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(
            @Qualifier("securityManager")DefaultWebSecurityManager securityManager){
         logger.info("shiro的过滤器执行了.....");
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
         //配置如果认证没有通过的话 那么跳转的这个页面
         shiroFilterFactoryBean.setLoginUrl("/toLogin");

        //设置用户未授权操作提示页
        shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorizedView");
         Map<String,String> maps=new LinkedHashMap<>();
         //第一个参数是路劲  第二个参数是过滤器的名字
        /**
         * 常见的过滤器的名字以及含义
         * /**：当前以及目录和后面的所有子目录全部都匹配上
         *       127.0.0.1:8080/bobo     127.0.0.1:8080/bobo/xiaobobo
         * /* ：这个相当于只是匹配当前这一级的节点   127.0.0.1:8080/bobo
         *      127.0.0.1:8080/bobo/xiaobobo
         * authc：认证的过滤器
         * anon： 表示的是/toIndex这个请求 不认证就可以访问 （匿名访问）
         *        maps.put("/toIndex","anon");
         * logout：登陆过滤器
         *        maps.put("/logout","logout")
         * perms：权限控制的
         * roles:具有某一个角色才能访问
         *
         * 注意事项：  /** 这个配置一定是最后 一个
         *
         */
        //maps.put("/toIndex","anon");  //表示的是不需要认证就可以访问
        //需身份认证
        maps.put("/stuListView", "authc");
        maps.put("/teaListView", "authc");
        maps.put("/login","anon");  //访问请求的地址
        maps.put("/login1","anon");  //访问请求的地址
        maps.put("/register","anon");  //访问请求的地址
        maps.put("/logout","logout");  //这个就是退出功能
        //角色过滤:需要用户拥有'admin'角色
        maps.put("/teaListView", "roles[admin]");
        //权限过滤:除身份认证外,还需要用户拥有对stuListView资源的view权限
        maps.put("/stuListView", "perms[stuListView:view]");
        maps.put("/teaListView", "perms[teaListView:view]");
        //配置记住我或认证通过方可以访问的地址
        maps.put("/index", "user");
        maps.put("/", "user");
        maps.put("/**","authc");   //所有的请求都必须在用户认证之后才能访问


        shiroFilterFactoryBean.setFilterChainDefinitionMap(maps);

        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        return shiroFilterFactoryBean;
     }


    //配置下SecurityManager
    @Bean
    public DefaultWebSecurityManager securityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //设置校验器
        securityManager.setAuthenticator(authenticator());
        List<Realm> realms=new ArrayList<>();
        realms.add(userRealm());
        realms.add(membersRealm());
        //设置Realm
        securityManager.setRealms(realms);
        return securityManager;
    }



    //配置的是userRealm
    @Bean
    public UserRealm userRealm(){
        UserRealm userRealm = new UserRealm();
        logger.info("userRealm的过滤器执行了.....");
//        myRealm.setCredentialsMatcher(hashedCredentialsMatcher());
        return userRealm;
    }

    //配置的是membersRealm
    @Bean
    public MembersRealm membersRealm(){
        MembersRealm membersRealm = new MembersRealm();
        logger.info("membersRealm的过滤器执行了.....");
//        myRealm.setCredentialsMatcher(hashedCredentialsMatcher());
        return membersRealm;
    }
//    @Bean
//    public CookieRememberMeManager rememberMeManager(){
//        CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();
//        //设置咋们的Cookie
//        rememberMeManager.setCookie(simpleCookie());
//        return rememberMeManager;
//    }
//
//    /**
//     * 自定义一个Cookie对象
//     * @return
//     */
//    @Bean
//    public SimpleCookie simpleCookie(){
//        SimpleCookie simpleCookie = new SimpleCookie("rememebenrMe");
//        simpleCookie.setMaxAge(2592000);
//        return simpleCookie;
//    }



//    public DefaultWebSessionManager sessionManager() {
//        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
//        //Session到底的时候是否自动删除
//        sessionManager.setDeleteInvalidSessions(true);
//        //设置session的超时时间
//        sessionManager.setGlobalSessionTimeout(100);
//        return sessionManager;
//
//    }
    //配置密码散列的问题
//    @Bean
//    public HashedCredentialsMatcher hashedCredentialsMatcher(){
//        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
//        //这里就是设置散列的方法的地方
//        hashedCredentialsMatcher.setHashAlgorithmName("MD5");
//        //设置的是散列的次数
//        hashedCredentialsMatcher.setHashIterations(1);
//        return hashedCredentialsMatcher;
//    }
    //下面就是认证器的配置
    @Bean
    public CustomModularRealmAuthenticator authenticator(){
        CustomModularRealmAuthenticator authenticator = new CustomModularRealmAuthenticator();
        return authenticator;
    }
}
